     <h1 class="entry-title entry-title-single" itemprop="headline">T-SQL 编程之日期函数及其应用</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <h4>1. 日期时间<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span></h4>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/sql" title="查看T-SQL中的全部文章" target="_blank">T-SQL</a></span> 关于日期、时间的<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span>有：</p>
<p><b>1).GETDATE() <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span></b> 返回当前的时间和日期</p>
<p><b>2).DATEPART() 函数</b> 返回日期/时间的单独部分，如：年、月、日、小时、分钟、秒等等</p>
<p><span id="more-602"></span></p>
<p><span style="color:Green;">语法：</span></p>
<p><b style="color:red; padding-left:20px;">DATEPART( datepart, datetime )</b></p>
<p>其中，datetime 是日期格式（即：数据库中相关时间字段）；</p>
<p>&nbsp;</p>
<p>datepart 的值有：</p>
<table width="363" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="bottom"><b>datepart</b><b></b></td>
<td valign="bottom"><b>缩写</b><b></b></td>
</tr>
<tr>
<td valign="top">年</td>
<td valign="top">yy, yyyy</td>
</tr>
<tr>
<td valign="top">季度</td>
<td valign="top">qq, q</td>
</tr>
<tr>
<td valign="top">月</td>
<td valign="top">mm, m</td>
</tr>
<tr>
<td valign="top">年中的日</td>
<td valign="top">dy, y</td>
</tr>
<tr>
<td valign="top">日</td>
<td valign="top">dd, d</td>
</tr>
<tr>
<td valign="top">周</td>
<td valign="top">wk, ww</td>
</tr>
<tr>
<td valign="top">星期</td>
<td valign="top">dw, w</td>
</tr>
<tr>
<td valign="top">小时</td>
<td valign="top">hh</td>
</tr>
<tr>
<td valign="top">分钟</td>
<td valign="top">mi, n</td>
</tr>
<tr>
<td valign="top">秒</td>
<td valign="top">ss, s</td>
</tr>
<tr>
<td valign="top">毫秒</td>
<td valign="top">ms</td>
</tr>
<tr>
<td valign="top">微妙</td>
<td valign="top">mcs</td>
</tr>
<tr>
<td valign="top">纳秒</td>
<td valign="top">ns</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><b>3).DATEADD() 函数</b> 返回在日期中添加或减去指定的时间间隔。</p>
<p><span style="color:Green;">语法：</span></p>
<p><b style="color:red; padding-left:20px;">DATEADD(datepart,number,datetime)</b></p>
<p>&nbsp;</p>
<p>datetime 是日期格式(即：数据库中相关时间字段)。</p>
<p>number 是您希望添加的间隔数；对于未来的时间，此数是正数，对于过去的时间，此数是负数。</p>
<p>datepart与 <b>DATEPART()</b> 函数中的 datepart 参数格式一样。</p>
<p>&nbsp;</p>
<p><b>4).DATEDIFF() 函数</b> 返回两个日期之间的天数</p>
<p><span style="color:Green;">语法：</span></p>
<p><b style="color:red; padding-left:20px;">DATEDIFF(datepart,startdate,enddate)</b></p>
<p>其中，startdate 指开始时间 ，enddate指结束时间。</p>
<p>datepar t与 <b>DATEART()</b> 函数中的 datepart 参数格式一样。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h4>2.日期函数的应用</h4>
<pre class="brush: sql;">
DECLARE @dtdatetime
SET @dt = GETDATE()

DECLARE @number int
SET @number = 3


---------------------------------------------------------------------
--1．指定日期该年的第一天或最后一天
---------------------------------------------------------------------

--A. 年的第一天
SELECT CONVERT(char(5), @dt, 120) + '1-1'

--B. 年的最后一天
SELECT CONVERT(char(5) ,@dt, 120) + '12-31'


---------------------------------------------------------------------
--2．指定日期所在季度的第一天或最后一天
---------------------------------------------------------------------

--A. 季度的第一天
SELECT CONVERT(datetime, CONVERT(char(8), 
       DATEADD(Month, DATEPART(Quarter,@dt) * 3 - Month(@dt) - 2, @dt), 120) +'1')


--B. 季度的最后一天（CASE判断法）
SELECT CONVERT(datetime, CONVERT(char(8), 
       DATEADD(Month, DATEPART(Quarter,@dt) * 3 - Month(@dt), @dt), 120) + 
       CASE WHEN DATEPART(Quarter, @dt) in (1,4) THEN '31' ELSE'30' END)


--C. 季度的最后一天（直接推算法）
SELECT DATEADD(Day, -1, CONVERT(char(8),

       DATEADD(Month, 1 + DATEPART(Quarter, @dt) * 3 - Month(@dt), @dt), 120) + '1')



---------------------------------------------------------------------
--3．指定日期所在月份的第一天或最后一天
---------------------------------------------------------------------

--A. 月的第一天
SELECT CONVERT(datetime, CONVERT(char(8), @dt, 120) + '1')

--B. 月的最后一天
SELECT DATEADD(Day, -1, CONVERT(char(8), DATEADD(Month, 1, @dt), 120) + '1')

--C. 月的最后一天（容易使用的错误方法）
SELECT DATEADD(Month, 1, DATEADD(Day, -DAY(@dt), @dt))



---------------------------------------------------------------------
--4．指定日期所在周的任意一天
---------------------------------------------------------------------

SELECT DATEADD(Day, @number - DATEPART(Weekday, @dt), @dt)



---------------------------------------------------------------------
--5．指定日期所在周的任意星期几
---------------------------------------------------------------------

--A. 一周的第1天为星期天
SELECT DATEADD(Day, @number - (DATEPART(Weekday, @dt) + @@DATEFIRST - 1) % 7, @dt)

--B. 一周的第1天为星期一
SELECT DATEADD(Day, @number - (DATEPART(Weekday, @dt) + @@DATEFIRST - 2) % 7 - 1, @dt)


</pre>
<p>&nbsp;</p>
<h4>3.输出日期格式</h4>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/sql" title="查看T-SQL中的全部文章" target="_blank">T-SQL</a></span> 中有区分 Datetime、Date、Time类型</p>
<p>其中，常常需要从Datetime中获取Date部分或Time部分，可以通过Convert函数转换成字符：</p>
<p>语法：</p>
<p><b style="color:red; padding-left:20px;">CONVERT(data_type,expression[,style])</b></p>
<p>E.g.:</p>
<p>一般情况下，日期显示格式为：yyyy-MM-dd，则可以用Style为23的样式:</p>
<pre class="brush: sql;">
Convert(nvarchar(10), GetDate(), 23)
</pre>
<p>&nbsp;</p>
<p><span style="color:red;">需要注意的是:</span><br />
<span style="color:red; padding-left:20px;">此语法一般在时间类型(datetime,smalldatetime) 与字符串类型 (nchar,nvarchar,char,varchar) 相互转换的时候才用到。</span></p>
<p>&nbsp;</p>
<p>Style 格式说明：</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="192">Style(2位表示年份)</td>
<td valign="top" width="148">Style(4位表示年份)</td>
<td valign="top" width="284">输入输出格式</td>
</tr>
<tr>
<td valign="top" width="192">0</td>
<td valign="top" width="148">100</td>
<td valign="top" width="284">mon dd yyyy hh:miAM(或PM)</td>
</tr>
<tr>
<td valign="top" width="192">1</td>
<td valign="top" width="148">101 美国</td>
<td valign="top" width="284">mm/dd/yy</td>
</tr>
<tr>
<td valign="top" width="192">2</td>
<td valign="top" width="148">102 ANSI</td>
<td valign="top" width="284">yy-mm-dd</td>
</tr>
<tr>
<td valign="top" width="192">3</td>
<td valign="top" width="148">103 英法</td>
<td valign="top" width="284">dd/mm/yy</td>
</tr>
<tr>
<td valign="top" width="192">4</td>
<td valign="top" width="148">104 德国</td>
<td valign="top" width="284">dd.mm.yy</td>
</tr>
<tr>
<td valign="top" width="192">5</td>
<td valign="top" width="148">105 意大利</td>
<td valign="top" width="284">dd-mm-yy</td>
</tr>
<tr>
<td valign="top" width="192">6</td>
<td valign="top" width="148">106</td>
<td valign="top" width="284">dd mon yy</td>
</tr>
<tr>
<td valign="top" width="192">7</td>
<td valign="top" width="148">107</td>
<td valign="top" width="284">mon dd,yy</td>
</tr>
<tr>
<td valign="top" width="192">8</td>
<td valign="top" width="148">108</td>
<td valign="top" width="284">hh:mm:ss</td>
</tr>
<tr>
<td valign="top" width="192">9</td>
<td valign="top" width="148">109</td>
<td valign="top" width="284">mon dd yyyy hh:mi:ss:mmmmAM(或PM)</td>
</tr>
<tr>
<td valign="top" width="192">10</td>
<td valign="top" width="148">110 美国</td>
<td valign="top" width="284">mm-dd-yy</td>
</tr>
<tr>
<td valign="top" width="192">11</td>
<td valign="top" width="148">111 日本</td>
<td valign="top" width="284">yy/mm/dd</td>
</tr>
<tr>
<td valign="top" width="192">12</td>
<td valign="top" width="148">112 ISO</td>
<td valign="top" width="284">yymmdd</td>
</tr>
<tr>
<td valign="top" width="192">13</td>
<td valign="top" width="148">113 欧洲默认值</td>
<td valign="top" width="284">dd mon yyyy hh:mi:ss:mmm(24小时制)</td>
</tr>
<tr>
<td valign="top" width="192">14</td>
<td valign="top" width="148">114</td>
<td valign="top" width="284">hh:mi:ss:mmm(24小时制)</td>
</tr>
<tr>
<td valign="top" width="192">20</td>
<td valign="top" width="148">120 ODBC 规范</td>
<td valign="top" width="284">yyyy-mm-dd hh:mi:ss(24小时制)</td>
</tr>
<tr>
<td valign="top" width="192">21</td>
<td valign="top" width="148">121</td>
<td valign="top" width="284">yyyy-mm-dd hh:mi:ss:mmm(24小时制)</td>
</tr>
<tr>
<td valign="top" width="192">22</td>
<td valign="top" width="148">&nbsp;</td>
<td valign="top" width="284">Mm/dd/yy hh:mi:ss AM(或PM)</td>
</tr>
<tr>
<td valign="top" width="192">23</td>
<td valign="top" width="148">&nbsp;</td>
<td valign="top" width="284">yyyy-mm-dd</td>
</tr>
<tr>
<td valign="top" width="192">24</td>
<td valign="top" width="148">&nbsp;</td>
<td valign="top" width="284">hh:mi:ss</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考文献：</p>
<p><a href="http://www.cnblogs.com/lpzzti/archive/2012/04/04/2431826.html" target="_blank">http://www.cnblogs.com/lpzzti/archive/2012/04/04/2431826.html</a></p>
<p><a href="http://blog.csdn.net/baiduandxunlei/article/details/9180075" target="_blank">http://blog.csdn.net/baiduandxunlei/article/details/9180075</a></p>
<p>&nbsp;</p>